/**
 * @brief 线程相关的封装
 */

#ifndef __THREAD_H__
#define __THREAD_H__

#include "mutex.h"
#include <functional>

class Thread : Noncopyable
{
public:
    // 线程智能指针类型
    typedef std::shared_ptr<Thread> ptr;

    Thread(const std::function<void()> &cb, const std::string &thread_name);
    ~Thread();

    // 线程ID
    pid_t getId() const { return m_thread_id; }

    // 线程名称
    const std::string &getName() const { return m_thread_name; }

    // 等待线程执行完成
    void join();

    // 获取当前线程指针
    static Thread *GetThis();

    // 获取当前线程名称
    static const std::string &GetName();

    // 设置线程名称
    static void SetName(const std::string &name);

private:
    static void *run(void *arg);

private:
    // 线程ID
    pid_t m_thread_id = -1;
    // 线程结构
    pthread_t m_thread = 0;
    // 线程执行函数
    std::function<void()> m_cb;
    // 线程名称
    std::string m_thread_name;
    // 信号量
    Semaphore m_semaphore;
};

#endif
